
/*
管道函数:即一个函数调用另一个函数的结果 pipe(func,func, func)(arg) 相当于 c(b(a(1)))
故调用pipe函数时返回的必须是函数 才能继续()调用 这个返回函数里需要用到上一个函数结果(也就是这个函数里有需要用到函数的连续调用)
 */

function pipe(...args1){
    return function(...args2){
        if(args1.length === 0) return;
        if(args1.length === 1) return args1[0](...args2);
        // 两个及以上的参数个数 通过reduce整合成一个管道函数(这也是reduce的一个应用了)
        return args1.reduce((a, b) => function() {
            return b(a(...args2))
        })()
    }
}
function sayHi(num) {
    console.log("hi!",num);
    return num + 2
}
function sayHello(num) {
    console.log("hello!",num);
}
function sayBye(num) {
    console.log("bye!",num);
    return num + 5
}
console.log(pipe(sayHi,sayBye, sayHello)(2));
